package exo1;

import java.util.Calendar;

import exception.CompteFermeException;
import exception.CreditSurPlafondException;
import exception.DebitNonAutoriseException;
import exception.DebitSousSeuilException;

public class CompteEpargne extends CompteAvecLimite {
	private static final int VERSEMENTMINIMUM = 100;
	private static final double TAUXREMUNERATIONVARIABLE = 2.2;
	private final int minimumOperation;

	public CompteEpargne(Personne nom, int numero, double solde, int plafond,
			int min) throws IllegalArgumentException {
		super(nom, numero, solde, plafond, 1);
		if (solde < VERSEMENTMINIMUM) {
			throw new IllegalArgumentException("Capital trop faible !");
		}
		this.minimumOperation = min;
	}

	@Override
	public boolean transferer(Compte compte, double montant)
			throws DebitNonAutoriseException, DebitSousSeuilException,
			CreditSurPlafondException, CompteFermeException {
		if (this.debiter(montant) == true) {
			compte.crediter(montant);
			return true;
		}
		return false;
	}

	@Override
	public boolean debiter(double montant) throws DebitNonAutoriseException,
			DebitSousSeuilException, IllegalArgumentException,
			CompteFermeException {
		if (this.isOuvert() == false) {
			throw new CompteFermeException("Le compte est fermé !");
		}
		if (montant < this.minimumOperation) {
			throw new IllegalArgumentException("Montant trop bas !");
		}
		double capital = this.getSolde() - montant;
		if (capital < 0) {
			throw new DebitNonAutoriseException("Solde négatif !");
		}
		if (capital < VERSEMENTMINIMUM) {
			throw new DebitSousSeuilException("En dessous du seuil !");
		}
		this.setSolde(capital);
		return true;
	}

	@Override
	public boolean crediter(double montant) throws CreditSurPlafondException,
			CompteFermeException {
		if (this.isOuvert() == false) {
			throw new CompteFermeException("Le compte est fermé !");
		}
		if (montant < this.minimumOperation) {
			throw new IllegalArgumentException("Montant trop bas !");
		}
		double capital = this.getSolde() + montant;
		if (capital > this.getPlafondDepot()) {
			throw new CreditSurPlafondException("Credit dépassé !");
		}
		this.setSolde(capital);
		return true;
	}

	public double calculerInteret() {
		// Récupérer le mois courant
		int mois = Calendar.getInstance().MONTH + 1;
		double interet = (TAUXREMUNERATIONVARIABLE / 100 / 12) * mois
				* this.getSolde();
		return interet;
	}
}
